<?php
/**
 * @package Обмен с 1С Управление торговлей 10.3.*.* 8.1
 * @author Непряхин Алексей Владимирович
 */

/**
 * Обмен производится по следующей схеме:
 * 1. 1С формирует прайс-лист в собственном формате xml (формат отличен от cml)
 * 2. 1С запрашивает с сервера параметры
 * 2.1 Аутентификация
 * 2.2 Параметры закачки, разрешены ли архивы и максимальный размер файла
 * 3.
 * @category ДокументацияМодуля
 */
ini_set('max_execution_time', 180);
// Configuration
require_once('config.php');
require_once(DIR_SYSTEM . 'library/db.php');
require_once('cml_exchange_catalog.php');
require_once('cml_exchange_catalog_txt.php');
require_once('cml_exchange_sale.php');
define('NULL_UUID', '00000000-0000-0000-0000-000000000000');


/**
 * Функция возвращает размер в байтах
 * @param string $val размер возвращаемый с префиксами мегабайт, гигабайт и т.д.
 * @return int
 */
function return_bytes($val) {
    $val = trim($val);
    $last = strtolower($val[strlen($val) - 1]);
    switch ($last) {
        // The 'G' modifier is available since PHP 5.1.0
        case 'g':
            $val *= 1024;
        case 'm':
            $val *= 1024;
        case 'k':
            $val *= 1024;
    }

    return $val;
}

/**
 * Возвращает максимальный размер файла доступный для закачки на сайт
 * @return integer
 */
function get_max_upload_file_size() {

    return return_bytes(ini_get('upload_max_filesize'));

}

/**
 * Процедура производит удаление всех файлов и подкаталогов в указанном каталоге
 *
 * @param string $directory Каталог который необходимо очистить
 * @param boolean $clear_root_dir Флаг определяющий надо ли удалять каталог,
 * используется для того, чтобы не удалить сам каталог, который необходимо очистить
 */
function clear_dir($directory, $empty = false) {
//    if(substr($directory,-1) == "/") {
//        $directory = substr($directory,0,-1);
//    }
//
//    if(!file_exists($directory) || !is_dir($directory)) {
//        return false;
//    } elseif(!is_readable($directory)) {
//        return false;
//    } else {
//        $directoryHandle = opendir($directory);
//
//        while ($contents = readdir($directoryHandle)) {
//            if($contents != '.' && $contents != '..') {
//                $path = $directory . "/" . $contents;
//
//                if(is_dir($path)) {
//                    clear_dir($path);
//                } else {
//                    unlink($path);
//                }
//            }
//        }
//
//        closedir($directoryHandle);
//
//        if($empty) {
//            if(!@rmdir($directory)) {
//                return false;
//            }
//        }
//
//        return true;
//    }
//    $dir = opendir($directory);
//    while (($file = readdir($dir)))
//    {
//        if (is_file($directory . "/" . $file)) {
//            @unlink($directory . "/" . $file);
//        }
//        else if (is_dir($directory . "/" . $file) &&
//                ($file != ".") && ($file != "..")) {
//            clear_dir($directory . "/" . $file, true);
//        }
//    }
//    closedir($dir);
//    if ($clear_root_dir) {
//        @rmdir($directory);
//    }
}

/**
 * Функции обработки ответов для обмена
 * @category ФункцииОбмена
 */

/**
 * Функция возвращает строки с параметрами обмена данными
 */
function return_exchange_parameters() {
    echo "zip=yes\n";
    echo "file_limit=" . (string) get_max_upload_file_size();
}

/**
 * Функция аутентификации пользователя
 * возвращает true если авторизован
 *  */
function auth_user($user = "exchange", $password = "11exchange11") {
    if (!isset($_SERVER['PHP_AUTH_USER'])) {
        header('WWW-Authenticate: Basic realm="Exchange in CommerceML2"');
        header('HTTP/1.0 401 Unauthorized');
        return false;
    } elseif (!(($_SERVER['PHP_AUTH_USER'] == $user) && ($_SERVER['PHP_AUTH_PW'] == $password))) {
        header('WWW-Authenticate: Basic realm="Exchange in CommerceML2"');
        header('HTTP/1.0 401 Unauthorized');
        return false;
    } else {
        return true;
    }
}
/**
 * Определяет является ли файл частью большого файла. Определяется если расширение файла = 001, 002 и т.д.
 * @param string $filename имя файла
 * @return boolean
 */
function is_part_of_file($filename){
    //

    $exploded_filename = explode('.', $filename);
    $fileext = end($exploded_filename);
    if(is_numeric($fileext)){
        return true;
    } else {
        return false;
    }
}

//**************************************************************************************

/*
 * Основной код программы
 */
// Report all PHP errors (see changelog)
error_reporting(E_ALL ^ E_NOTICE);

if (auth_user()) {
    $req_type = "";
    $req_mode = "";
    if (isset($_GET['type'])) {
        $req_type = $_GET['type'];
    }
    if (isset($_GET['?type'])) {
        $req_type = $_GET['?type'];
    }
    if (isset($_GET['mode'])) {
        $req_mode = $_GET['mode'];
    }

    //TODO: Сделать рефакторинг данного куска кода, а именно вынести в отдельный файл

    // Проверка авторизации, из формы настроек
    if (($req_type == "catalog") && ($req_mode == "checkauth")) {
        $test_response = "success";
        echo $test_response;
    }

    // инициализация обмена данными, надо вернуть чего-то
    if (($req_type == "catalog") && ($req_mode == "init")) {
        return_exchange_parameters();
        //echo $test_response;
    }


    if (($req_type == "catalog") && ($req_mode == "file")) {

        $req_filename = "";
        // ОтветСервера_АварийноеЗавершениеТекущейОперации = failure
        // ОтветСервера_УспешноеЗавершениеТекущейОперации  = success
        if (isset($_GET['filename'])) {
            $req_filename = $_GET['filename'];
        }

        $test_response = "failure";
        if ($_SERVER['REQUEST_METHOD'] == 'POST') {

            if (function_exists("file_get_contents"))
                $DATA = file_get_contents("php://input");
            elseif (isset($GLOBALS["HTTP_RAW_POST_DATA"]))
                $DATA = &$GLOBALS["HTTP_RAW_POST_DATA"];
            else
                $DATA = false;

            if ($DATA != false) {
                $fname = DIR_DOWNLOAD . "/" . $req_filename;

                if ($fp = fopen($fname, 'ab')) {
                    $result = fwrite($fp, $DATA);
                    fclose($fp);
                    if ($result === strlen($DATA)) {
                        //Удаление всех файлов в каталоге обмена
                        clear_dir(DIR_DOWNLOAD . '/');
                        // распаковка архива
                        if (!is_part_of_file($fname)) {
                            $zip = new ZipArchive;
                            if ($zip->open($fname) === TRUE) {
                                $zip->extractTo(DIR_DOWNLOAD);
                                $zip->close();
                                $test_response = "success";
                                //parse_cml2(DIR_DOWNLOAD);
                            } else {
                                $test_response = "failure";

                            }
                        }
                    } else {
                        $test_response = "failure";
                    }

                } else {
                    $test_response = "failure";
                }


            }
            if ($test_response == "success") {

            }
        }
        echo $test_response;
        if ($test_response == 'failure') {
            var_dump(error_get_last());
        }
    }

    if (($req_type == "catalog") && ($req_mode == "import")) {
        $req_filename = "";
        if (isset($_GET['filename'])) {
            $req_filename = $_GET['filename'];
        }
        //1 //http://www.asana-auto.ru/store/cml_exchange.php?type=catalog&mode=&import&filename=import.xml
        //2 //http://www.asana-auto.ru/store/cml_exchange.php?type=catalog&mode=&import&format=txt&filename=offers.xml
        if (isset($_GET['format'])) {
            $req_format = $_GET['format'];
        } else {
            $req_format = 'xml';
        }

        if ($req_format == 'xml'){
            parse_cml2(DIR_DOWNLOAD, $req_filename);
        } else if ($req_format == 'txt') {
            parse_text(DIR_DOWNLOAD, $req_filename);
        }
    }
    if (($req_type == "db") && ($req_mode=="clear")) {
        clear_database(); //cml_exchange.php?type=db&mode=clear
    }
    if (($req_type == "db") && ($req_mode=="info")) {

        //http://www.asana-auto.ru/store/cml_exchange.php?type=db&mode=info
        phpinfo();
    }

    if (($req_type === "sale") && $req_mode === "checkauth"){
        $test_response = "success";
        echo $test_response;
    }
    if (($req_type === "sale") && $req_mode === "query"){
        $test_response = "success";
  //      echo $test_response;
        export_to_cml2();
    }

}

?>
